package web.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;

public class RSAUtil
{
  public static final String SIGN_ALGORITHMS = "SHA1WithRSA";

  public static String sign(String content, String privateKey, String input_charset)
  {
    try
    {
      PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64Util.decode(privateKey));
      KeyFactory keyf = KeyFactory.getInstance("RSA");
      PrivateKey priKey = keyf.generatePrivate(priPKCS8);

      Signature signature = 
        Signature.getInstance("SHA1WithRSA");

      signature.initSign(priKey);
      signature.update(content.getBytes(input_charset));

      byte[] signed = signature.sign();

      return Base64Util.encode(signed);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }

    return null;
  }

  public static boolean verify(String content, String sign, String ali_public_key, String input_charset)
  {
    try
    {
      KeyFactory keyFactory = KeyFactory.getInstance("RSA");
      byte[] encodedKey = Base64Util.decode(ali_public_key);
      PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));

      Signature signature = 
        Signature.getInstance("SHA1WithRSA");

      signature.initVerify(pubKey);
      signature.update(content.getBytes(input_charset));

      return signature.verify(Base64Util.decode(sign));
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }

    return false;
  }

  public static String decrypt(String content, String private_key, String input_charset)
    throws Exception
  {
    PrivateKey prikey = getPrivateKey(private_key);

    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(2, prikey);

    InputStream ins = new ByteArrayInputStream(Base64Util.decode(content));
    ByteArrayOutputStream writer = new ByteArrayOutputStream();

    byte[] buf = new byte[''];
    int bufl;
    while ((bufl = ins.read(buf)) != -1)
    {
   //   int bufl;
      byte[] block = null;

      if (buf.length == bufl) {
        block = buf;
      } else {
        block = new byte[bufl];
        for (int i = 0; i < bufl; i++) {
          block[i] = buf[i];
        }
      }

      writer.write(cipher.doFinal(block));
    }

    return new String(writer.toByteArray(), input_charset);
  }

  public static PrivateKey getPrivateKey(String key)
    throws Exception
  {
    byte[] keyBytes = Base64Util.decode(key);

    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);

    KeyFactory keyFactory = KeyFactory.getInstance("RSA");

    PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

    return privateKey;
  }
}